﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
using Utilities;

namespace BusinessLogicLayer
{
    public class NguoiDungManager
    {
        public ActionResultAsList<NguoiDung> LayDS()
        {
            var ar = new ActionResultAsList<NguoiDung>();
            try
            {
                using (var db = new ThuVienDbContext())
                {
                    ar.ObjectList = db.NguoiDungs.ToList();
                }
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                ar.AddException(ex);
            }
            return ar;
        }
        public ValidateResult KiemTraHopLe(NguoiDung ngDung)
        {
            ValidateResult vr = new ValidateResult();
            if (ngDung.HoTen == "")
                vr.AddMessage("Người dùng chưa nhập họ tên người dùng!!!");
            if (ngDung.TaiKhoan == "")
                vr.AddMessage("Người dùng chưa nhập tài khoản người dùng!!!");
            if (ngDung.MatKhau == "")
                vr.AddMessage("Người dùng chưa nhập mật khẩu người dùng!!!");
            if ((DateTime.Now.Year - ngDung.NgaySinh.Year) < 25)
                vr.AddMessage("Người dùng chưa đủ 25 tuổi!!!");
            if (ngDung.MatKhau.Length < 6)
                vr.AddMessage("Mật khẩu ít nhất 6 ký tự!!!");
            return vr;
        }
        public ValidateResult KiemTraTrungTaiKhoan(string taiKhoan)
        {
            ValidateResult vr = new ValidateResult();
            try
            {
                using (var db = new ThuVienDbContext())
                {
                    var tk = db.NguoiDungs.Where(n => n.TaiKhoan == taiKhoan);
                    if (tk.Any())
                        vr.AddMessage("Tài khoản đã tồn tại");
                }
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                vr.AddMessage(ex.Message);
            }
            return vr;
        }
        public ActionResult Them(NguoiDung ngDung)
        {
            var ar = new ActionResult();
            using (var transaction = new TransactionScope())
            {
                using (var db = new ThuVienDbContext())
                {
                    try
                    {
                        db.NguoiDungs.Add(ngDung);
                        db.SaveChanges();
                        //db.Entry(ngDung).GetDatabaseValues();
                        int id = ngDung.MaNguoiDung;
                        PhanQuyenManager pm = new PhanQuyenManager();
                        var ar1 = pm.ThemPhanQuyen(id);
                        if (ar1.Success)
                            transaction.Complete();
                        else
                            ar.Exceptions.AddRange(ar1.Exceptions);
                    }
                    catch (Exception ex)
                    {
                        Logger.Write(ex);
                        ar.AddException(ex);
                    }
                }
            }
            return ar;
        }
        public ActionResult Xoa(int maNgDung)
        {
            var ar = new ActionResult();
            using (var transaction = new TransactionScope())
            {
                try
                {
                    using (var db = new ThuVienDbContext())
                    {
                        var pqmn = new PhanQuyenManager();
                        var xoaPQ = pqmn.XoaPhanQuyen(maNgDung);
                        if (xoaPQ.Success)
                        {
                            var ngDung = db.NguoiDungs.Single(ng => ng.MaNguoiDung == maNgDung);
                            db.NguoiDungs.Remove(ngDung);
                            db.SaveChanges();
                            transaction.Complete();
                        }
                        else
                            ar.Exceptions.AddRange(xoaPQ.Exceptions);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Write(ex);
                    ar.AddException(ex);
                }
            }
            return ar;
        }
        public ActionResult Sua(NguoiDung ngDung)
        {
            var ar = new ActionResult();
            using (var db = new ThuVienDbContext())
            {
                try
                {
                    var nd = db.NguoiDungs.Single(n => n.MaNguoiDung == ngDung.MaNguoiDung);
                    nd.HoTen = ngDung.HoTen;
                    nd.GioiTinh = ngDung.GioiTinh;
                    nd.NgaySinh = ngDung.NgaySinh;
                    nd.TaiKhoan = ngDung.TaiKhoan;
                    nd.MatKhau = ngDung.MatKhau;
                    db.SaveChanges();
                }
                catch (Exception ex)
                {
                    Logger.Write(ex);
                    ar.AddException(ex);
                }
            }
            return ar;
        }
        public ActionResultAsList<NguoiDung> TimTheoMa(int ma)
        {
            var ar = new ActionResultAsList<NguoiDung>();
            try
            {
                using (var db = new ThuVienDbContext())
                {
                    var list = db.NguoiDungs.Where(n => n.MaNguoiDung == ma);
                    ar.ObjectList = list.ToList();
                }
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                ar.AddException(ex);
            }
            return ar;
        }
        public ActionResultAsList<NguoiDung> TimTheoTen(string ten)
        {
            var ar = new ActionResultAsList<NguoiDung>();
            try
            {
                using (var db = new ThuVienDbContext())
                {
                    var list = db.NguoiDungs.Where(n => n.HoTen.Contains(ten));
                    ar.ObjectList = list.ToList();
                }
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                ar.AddException(ex);
            }
            return ar;
        }
        public int KiemTraTaiKhoanVaMatKhau(string taiKhoan, string matKhau)
        {
            var vr = new ValidateResult();
            try
            {
                using (var db = new ThuVienDbContext())
                {
                    var nd = db.NguoiDungs.Where(n => n.TaiKhoan == taiKhoan && n.MatKhau == matKhau);
                    if (nd.Any())
                        return nd.First().MaNguoiDung;
                }
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                vr.AddMessage(ex.Message);
            }
            return -1;
        }
        public ActionResult DoiMatKhau(int maNgDung, string matKhaumoi)
        {
            var ar = new ActionResult();
            using (var db = new ThuVienDbContext())
            {
                try
                {
                    var nd = db.NguoiDungs.Single(n => n.MaNguoiDung == maNgDung);
                    nd.MatKhau = matKhaumoi;
                    db.SaveChanges();
                }
                catch (Exception ex)
                {
                    Logger.Write(ex);
                    ar.AddException(ex);
                }
            }
            return ar;
        }
        public ValidateResult KiemTraDoiMatKhau(int maNgDung, string mkCu, string mkMoi, string mkNhapLai)
        {
            var vr = new ValidateResult();
            try
            {
                using (var db = new ThuVienDbContext())
                {
                    var nd = db.NguoiDungs.Single(n => n.MaNguoiDung == maNgDung);
                    if (nd.MatKhau != mkCu)
                        vr.AddMessage("Mật khẩu cũ không đúng");
                }
                if (mkMoi.CompareTo(mkNhapLai) != 0)
                    vr.AddMessage("Mật khẩu nhập lại không trùng với mật khẩu mới");
                if (mkMoi.Length < 6)
                    vr.AddMessage("Mật khẩu mới không đủ 6 ký tự");
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                vr.AddMessage(ex.Message);
            }
            return vr;
        }
    }
}
